/** 【文件说明】：字符串处理工具类
 *  【使用例子】：
 
    import { StringUtils } from '@/utils/stringUtils';

    // 在某个方法或生命周期钩子中使用
    console.log(StringUtils.substring('Hello, World!', 7, 12)); // 输出 "World"
    console.log(StringUtils.toUpperCase('hello')); // 输出 "HELLO"
    console.log(StringUtils.toLowerCase('WORLD')); // 输出 "world"
    console.log(StringUtils.trim('   Hello, World!   ')); // 输出 "Hello, World!"
    console.log(StringUtils.removeAllWhitespace('Hello,   World!')); // 输出 "Hello,World!"
    console.log(StringUtils.split('apple,banana,orange', ',')); // 输出 ["apple", "banana", "orange"]
    console.log(StringUtils.join(['apple', 'banana', 'orange'], ', ')); // 输出 "apple, banana, orange"
    console.log(StringUtils.isBlank('   ')); // 输出 true
    console.log(StringUtils.replace('Hello, World!', 'World', 'Universe')); // 输出 "Hello, Universe!"
    console.log(StringUtils.length('Hello, World!')); // 输出 13
    console.log(StringUtils.startsWith('Hello, World!', 'Hello')); // 输出 true
    console.log(StringUtils.endsWith('Hello, World!', 'World!')); // 输出 true
    console.log(StringUtils.contains('Hello, World!', 'World')); // 输出 true
    console.log(StringUtils.repeat('Ha', 3)); // 输出 "HaHaHa"
    console.log(StringUtils.reverse('hello')); // 输出 "olleh"
    console.log(StringUtils.padStart('5', 4, '0')); // 输出 "0005"
    console.log(StringUtils.padEnd('5', 4, '0')); // 输出 "5000"
    
 */
export class StringUtils {
    /**
     * 截取字符串（支持负数索引）
     * @param str 要截取的字符串
     * @param start 开始位置
     * @param end 结束位置（可选）
     * @returns 返回截取后的子字符串
     */
    static substring(str: string, start: number, end?: number): string {
      if (start < 0) {
        start = str.length + start;
      }
      if (end !== undefined && end < 0) {
        end = str.length + end;
      }
      return str.substring(start, end);
    }
  
    /**
     * 转换为大写
     * @param str 要转换的字符串
     * @returns 返回转换为大写后的字符串
     */
    static toUpperCase(str: string): string {
      return str.toUpperCase();
    }
  
    /**
     * 转换为小写
     * @param str 要转换的字符串
     * @returns 返回转换为小写后的字符串
     */
    static toLowerCase(str: string): string {
      return str.toLowerCase();
    }
  
    /**
     * 去除前后空白字符
     * @param str 要去除空白字符的字符串
     * @returns 返回去除了前后空白字符的字符串
     */
    static trim(str: string): string {
      return str.trim();
    }
  
    /**
     * 去除所有空白字符
     * @param str 要去除空白字符的字符串
     * @returns 返回去除了所有空白字符的字符串
     */
    static removeAllWhitespace(str: string): string {
      return str.replace(/\s+/g, '');
    }
  
    /**
     * 字符串转数组（以分隔符分割）
     * @param str 要分割的字符串
     * @param separator 分隔符
     * @returns 返回分割后的数组
     */
    static split(str: string, separator: string | RegExp): string[] {
      return str.split(separator);
    }
  
    /**
     * 数组转字符串（以分隔符连接）
     * @param arr 要连接的数组
     * @param separator 分隔符
     * @returns 返回连接后的字符串
     */
    static join(arr: string[], separator: string): string {
      return arr.join(separator);
    }
  
    /**
     * 检查字符串是否为空或只包含空白字符
     * @param str 要检查的字符串
     * @returns 如果字符串为空或只包含空白字符则返回 true，否则返回 false
     */
    static isBlank(str: string): boolean {
      return !str || /^\s*$/.test(str);
    }
  
    /**
     * 替换字符串中的某些内容
     * @param str 要替换的字符串
     * @param searchValue 要查找的内容
     * @param replaceValue 替换后的内容
     * @returns 返回替换后的新字符串
     */
    static replace(str: string, searchValue: string | RegExp, replaceValue: string): string {
      return str.replace(searchValue, replaceValue);
    }
  
    /**
     * 获取字符串长度
     * @param str 要获取长度的字符串
     * @returns 返回字符串的长度
     */
    static length(str: string): number {
      return str.length;
    }
  
    /**
     * 判断字符串是否以指定前缀开始
     * @param str 要检查的字符串
     * @param prefix 前缀
     * @returns 如果字符串以前缀开始则返回 true，否则返回 false
     */
    static startsWith(str: string, prefix: string): boolean {
      return str.startsWith(prefix);
    }
  
    /**
     * 判断字符串是否以指定后缀结束
     * @param str 要检查的字符串
     * @param suffix 后缀
     * @returns 如果字符串以后缀结束则返回 true，否则返回 false
     */
    static endsWith(str: string, suffix: string): boolean {
      return str.endsWith(suffix);
    }
  
    /**
     * 检查字符串是否包含子串
     * @param str 要检查的字符串
     * @param substr 子串
     * @returns 如果字符串包含子串则返回 true，否则返回 false
     */
    static contains(str: string, substr: string): boolean {
      return str.includes(substr);
    }
  
    /**
     * 重复字符串n次
     * @param str 要重复的字符串
     * @param n 重复次数
     * @returns 返回重复后的字符串
     */
    static repeat(str: string, n: number): string {
      return str.repeat(n);
    }
  
    /**
     * 反转字符串
     * @param str 要反转的字符串
     * @returns 返回反转后的字符串
     */
    static reverse(str: string): string {
      return str.split('').reverse().join('');
    }
  
    /**
     * 填充字符串到指定长度（左侧填充）
     * @param str 要填充的字符串
     * @param targetLength 目标长度
     * @param padString 填充字符串（默认为空格）
     * @returns 返回填充后的字符串
     */
    static padStart(str: string, targetLength: number, padString: string = ' '): string {
      return str.padStart(targetLength, padString);
    }
  
    /**
     * 填充字符串到指定长度（右侧填充）
     * @param str 要填充的字符串
     * @param targetLength 目标长度
     * @param padString 填充字符串（默认为空格）
     * @returns 返回填充后的字符串
     */
    static padEnd(str: string, targetLength: number, padString: string = ' '): string {
      return str.padEnd(targetLength, padString);
    }
  }